로딩 중이에요... 🐣
[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
9. 이미지처리 | ✅ 저자: 이유정(박사)
(venv) pip install Pillow
Pillow의 리사이즈 방식 비교
빨간 화살표는
fit()
방식 강조:
이미지를 정해진 사이즈에 맞춰 자르고 정확히 맞추는 기능
썸네일 생성 함수 + 모델에 적용 utils.py
create_thumbnail()
함수
utils.py
같은 헬퍼 파일에 작성하는 것이 일반적
이미지 코드에 있는 주요 단계
Image.open()
– 이미지 열기img.convert('RGB')
– RGB 변환ImageOps.fit()
– 썸네일 리사이징BytesIO
– 메모리 버퍼에 저장ContentFile
– Django가 저장할 수 있는 파일 객체로 변환
UserProfile
모델 확장 models.py
profile_image
: 원본 이미지 저장thumbnail
: 썸네일 이미지 저장save()
오버라이드 → 저장 시 자동으로 썸네일 생성
이미지 코드에 있는 주요 단계
- 프로필 이미지가 존재할 경우
create_thumbnail()
호출로 썸네일 생성self.thumbnail.save()
로 저장super().save()
로 나머지 저장 처리
your_app/utils.py
– 썸네일 생성 함수
from PIL import Image, ImageOps
from io import BytesIO
from django.core.files.base import ContentFile
def create_thumbnail(image, size=(300, 300)):
"""이미지를 썸네일로 리사이징하고 ContentFile로 반환"""
img = Image.open(image)
img = img.convert('RGB') # RGBA → RGB
thumb = ImageOps.fit(img, size, Image.ANTIALIAS)
# 자르면서 리사이징
thumb_io = BytesIO()
thumb.save(thumb_io, format='JPEG')
return ContentFile(thumb_io.getvalue(), name=image.name)
your_app/models.py
– UserProfile 모델
from django.db import models
from .utils import create_thumbnail
class UserProfile(models.Model):
user = models.OneToOneField('auth.User', on_delete=models.CASCADE)
profile_image = models.ImageField(upload_to='profiles/', null=True, blank=True)
thumbnail = models.ImageField(upload_to='profiles/thumbnails/', null=True, blank=True)
def save(self, *args, **kwargs):
# 원본 이미지가 있을 경우 썸네일 생성
if self.profile_image:
thumb = create_thumbnail(self.profile_image)
self.thumbnail.save(f"thumb_{self.profile_image.name}", thumb, save=False)
super().save(*args, **kwargs)
settings.py
– 미디어 파일 경로 설정 (필수)
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
admin.py
– (선택) 관리자에서 이미지 미리보기
from django.contrib import admin
from .models import UserProfile
@admin.register(UserProfile)
class UserProfileAdmin(admin.ModelAdmin):
list_display = ['user', 'profile_image', 'thumbnail']
실제 적용 예시
사용자가 프로필 이미지 업로드
→ UserProfile.save()가 호출됨
→ utils.create_thumbnail()로 썸네일 자동 생성
→ .thumbnail.save()로 저장됨